#ifndef LINUX_MEMORY32_H
#define LINUX_MEMORY32_H

#include <types.h>
#include <bitmap.h>
#include <mutex.h>
#include <memory.h>

// 可用内存开始位置
#define MEMORY_EXT_START    0x100000
// 可用内存结束位置
#define MEMORY_EXT_LIMIT    0x8000000

#define MEMORY_EBDA_START   0x80000

// 进程内存开始位置
#define MEMORY_TASK_BASE    0x80000000

// 用户栈顶地址
#define MEMORY_TASK_STACK_TOP   0xE0000000

// 预留参数空间
#define MEMORY_TASK_ARG_SIZE    (PAGE_SIZE * 4)

// 用户栈空间大小
#define MEMORY_TASK_STACK_SIZE  (PAGE_SIZE * 500)

typedef struct memory32_info_t
{
    // 内存分配锁
    mutex_t mutex;    
    // 内存起始地址
    uint32_t start;
    // 总字节数
    uint32_t size;
    // 每页的字节数
    uint32_t page_size;
    // 内存位图
    bitmap_t bitmap;
} memory32_info_t;

typedef struct memory32_map_t
{
    // 虚拟起始地址
    void *vstart;
    // 虚拟结束地址
    void *vlimit;
    // 物理起始地址
    void *pstart;
    // 权限
    uint32_t perm;
} memory32_map_t;

void init_memory(memory_info_t *memory_info);

uint32_t memory32_create_pde();

int alloc_pages(uint32_t index, uint32_t size, uint32_t perm);

uint32_t alloc_page();

int alloc_pages(uint32_t index, uint32_t size, uint32_t perm);

void free_page(uint32_t addr);

int memory32_copy_page(uint32_t index);

int memory32_copy_page_data(uint32_t to, uint32_t pde, uint32_t from, uint32_t size);

void memory32_destory_page(uint32_t index);

int memory32_alloc_task_pages(uint32_t pde, uint32_t index, uint32_t size, uint32_t perm);

uint32_t memory32_get_paddr(uint32_t pde, uint32_t vaddr);


char *sys_sbrk(int incr);

#endif